<html>
  <head><title>My Library</title></head>
  <body>
<?php
class BookList{
    var $parser,$record,$current_field='',$field_type,$ends_record,$records;
    function BookList($filename){
        $this->parser=xml_parser_create("utf-8");
        xml_set_object($this->parser,$this);
        xml_set_element_handler($this->parser,start_element,end_element);
        xml_set_character_data_handler($this->parser,cdata);
         
        //1=单个字段，2=数组字段，3=记录容器
        $this->field_type=array('title'=>1,
                                'author'=>2,
                                'isbn'=>1,
                                'comment'=>1 );
        $this->ends_record=array("book"=>true);
        $x=join("",file($filename));
        xml_parse($this->parser,$x);
        xml_parser_free($this->parser);
    }
    function start_element($p,$element,&$attributes){
        $element=strtolower($element);
        if($this->field_type[$element]!=0){
            $this->current_field=$element;
        }else{
            $this->current_field='';
        }
    }
    function end_element($p,$element){
        $element=strtolower($element);
        if($this->ends_record[$element]){
            $this->records[]=$this->record;
            $this->record=array();
        }
        $this->current_field='';
    }
    function cdata($p,$text){
        if($this->field_type[$this->current_field]===2){
            $this->record[$this->current_field][]=$text;
        }elseif($this->field_type[$this->current_field]===1){
            $this->record[$this->current_field]=$text;
        }
    }
    function show_menu()
    {
        echo "<table border='1'>\n";
        if(!empty($this->records)){
        foreach($this->records as $book){
            echo "<tr>";
            $authors=join(',',$book['author']);
            printf("<th><a href='%s'>%s</a></th><td>%s</td>\n",
            $_SERVER['PHP_SELF'].'?isbn='.$book['isbn'],
            $book['title'],
            $authors);
            echo "</tr>\n";
        }}
        echo "</table>";
    }
    function show_book($isbn){
        $Find=false;
        foreach($this->records as $book){
            if($book['isbn']===$isbn){
                $author=join(',',$book['author']);
                printf("<b>%s</b> by %s.<br>",$book['title'],$author);
                printf("ISBN:%s<br>",$isbn);
                printf("Comment:%s\n",$book['comment']);    
                $Find=true;            
                break;                
            }
        }
        if(!$Find)echo "<b style='color:red'>Can't find this book of '$isbn'</b>";
        echo '<p>Back to the <a href="'.$_SERVER['PHP_SELF'].'">list of books</a>.</p>';
    }
}
 
$lib=new BookList("./book.xml");
if($_GET['isbn']){
    $lib->show_book($_GET['isbn']);
}
else{
    $lib->show_menu();
}
?>
</body>
</html>